﻿#include "disassembleservice.h"
DisassembleService::DisassembleService()
{

}
/**
 * @brief DisassembleService::disassemble
 * @param ud_obj
 * @param str:返回汇编指令缓冲区
 * @param DisassembleAddr：反汇编起点
 * @param Eip：反汇编缓冲区指针
 * @param disassembleMode：模式(x64,x86)
 * @return
 */
ULONG  DisassembleService::disassemble(ud_t* ud_obj,PCHAR str,ULONG_PTR DisassembleAddr,ULONG_PTR Eip,DisassembleMode disassembleMode)
{
    //初始化结构体
    ud_init(ud_obj);
    //设置为32位元CPU模式
    ud_set_mode(ud_obj,disassembleMode);
    //结果使用Intel语法
    ud_set_syntax(ud_obj,UD_SYN_INTEL);
    //设置反汇编起点
    ud_set_pc(ud_obj,DisassembleAddr);
    //设置输入缓冲区
    ud_set_input_buffer(ud_obj,(uint8_t*)Eip,AssemblyStringBufferLength);
    //开始反汇编,返回长度
    ULONG instructLength=ud_disassemble(ud_obj);
    //复制结果
    strcpy(str,ud_insn_asm(ud_obj));
    return instructLength;
}

bool  DisassembleService::ParseAssemble(PXEDPARSE xed,QString qStr,ULONG_PTR Eip,bool IsX64)
{
    RtlZeroMemory(xed,sizeof(XEDPARSE));
    //设置起始地址,用于计算跳转指令需要
    xed->cip=Eip;
    //设置解析模式
    xed->x64=IsX64;
    std::string str = qStr.toStdString();
    RtlCopyMemory(xed->instr,str.c_str(),strlen(str.c_str()));
    if (XEDPARSE_OK != XEDParseAssemble(xed)) {
        qDebug()<<"指令错误："<< QString::fromLocal8Bit(xed->error);
        return false;
    }
    return true;
}

